package com.strange3.multiplemodulespreloader
{
	import com.strange3.utils.modules.ModuleLoadableContentCreator;
	import com.strange3.utils.modules.batchpreloader.IBatchPreloader;
	
	import flash.events.Event;
	import flash.events.EventDispatcher;

	public class BatchPreloader extends EventDispatcher implements IBatchPreloader
	{
		public static const batchLoaded:String = "batchLoaded";
		
		protected var _modules:Array;
		
		protected var _loadedModules:Array;
		
		public function BatchPreloader():void {
			_modules = new Array();
			_loadedModules = new Array();
		}
		
		/**
		 * Getter for loaded modules 
		 * @return 
		 * 
		 */
		public function get loadedModules():Array {
			return this._loadedModules;
		}
		
		public function addModule(m:ModuleLoadableContentCreator):void {
			
			// dodajemy moduł do tablicy z modułami do załadowania
			_modules.push(m);
			m.addEventListener(Event.COMPLETE, onModuleContentLoaded);
		}
		
		
		public function load():void {
			
			// przechodzimy po wszystkich modułach przypisanych do preloadera
			// i odpalamy im ładowanie
			for(var i:int; i<_modules.length; i++) {
				(_modules[i] as ModuleLoadableContentCreator).loadModule();
			}
		}
		
		/**
		 * Funkcja wywoływana podczas załadowania któregoś z modułów
		 * przypisanych do loadera 
		 * @param e
		 * 
		 */
		private function onModuleContentLoaded(e:Event):void {
			// usuwamy ten listener z obiektu
			e.target.removeEventListener(Event.COMPLETE, onModuleContentLoaded);
			
			// we're adding loaded modle to array
			this._loadedModules.push(e.target);
		
			// jeśli liczba załadowanych modułów jest równa liczbie modułów
			// które są włączone do tej klasy, to wysyłamy event informujący o tym
			if(this._loadedModules.length == this._modules.length) {
				this.dispatchEvent(new Event(BatchPreloader.batchLoaded));
			}
		}

	}
}